<!DOCTYPE html>
<html>
<head>
  <link rel='stylesheet' href='qunit/qunit.css' type='text/css'/>
  <script src='../editor/lib/jquery.js'></script>
  <script type='text/javascript' src='../editor/src/math.js'></script>
  <script type='text/javascript' src='qunit/qunit.js'></script>
  <script type='text/javascript'>
  $(function() {
  	// log function
  	QUnit.log = function(result, message) {
		if (window.console && window.console.log) {
			window.console.log(result +' :: '+ message);
		}
	};

	var svgns = 'http://www.w3.org/2000/svg';
	var svg = document.createElementNS(svgns, 'svg');

	module('svgedit.math');

	test('Test svgedit.math package', function() {
		expect(7);
		
		ok(svgedit.math);
		ok(svgedit.math.transformPoint);
		ok(svgedit.math.isIdentity);
		ok(svgedit.math.matrixMultiply);
		equals(typeof svgedit.math.transformPoint, typeof function(){});
		equals(typeof svgedit.math.isIdentity, typeof function(){});
		equals(typeof svgedit.math.matrixMultiply, typeof function(){});
	});

	test('Test svgedit.math.transformPoint() function', function() {
		expect(6);
		var transformPoint = svgedit.math.transformPoint;

		var m = svg.createSVGMatrix();
		m.a = 1; m.b = 0;
		m.c = 0; m.d = 1;
		m.e = 0; m.f = 0;
		var pt = transformPoint(100, 200, m);
		equals(pt.x, 100);
		equals(pt.y, 200);
		
		m.e = 300; m.f = 400;
		pt = transformPoint(100, 200, m);
		equals(pt.x, 400);
		equals(pt.y, 600);
		
		m.a = 0.5; m.b = 0.75;
		m.c = 1.25; m.d = 2;
		pt = transformPoint(100, 200, m);
		equals(pt.x, 100 * m.a + 200 * m.c + m.e);
		equals(pt.y, 100 * m.b + 200 * m.d + m.f);
	});
	
	test('Test svgedit.math.isIdentity() function', function() {
		expect(2);

		ok(svgedit.math.isIdentity(svg.createSVGMatrix()));

		var m = svg.createSVGMatrix();
		m.a = 1; m.b = 0;
		m.c = 0; m.d = 1;
		m.e = 0; m.f = 0;
		ok(svgedit.math.isIdentity(m));
	});

	test('Test svgedit.math.matrixMultiply() function', function() {
		expect(5);
		var mult = svgedit.math.matrixMultiply;
		var isIdentity = svgedit.math.isIdentity;

		// translate there and back
		var tr_1 = svg.createSVGMatrix().translate(100,50),
			tr_2 = svg.createSVGMatrix().translate(-90,0),
			tr_3 = svg.createSVGMatrix().translate(-10,-50),
			I = mult(tr_1,tr_2,tr_3);
		ok(isIdentity(I), 'Expected identity matrix when translating there and back');

		// rotate there and back
		// TODO: currently Mozilla fails this when rotating back at -50 and then -40 degrees
		// (b and c are *almost* zero, but not zero)
		var rot_there = svg.createSVGMatrix().rotate(90),
			rot_back = svg.createSVGMatrix().rotate(-90); // TODO: set this to -50
			rot_back_more = svg.createSVGMatrix().rotate(0); // TODO: set this to -40
		I = mult(rot_there, rot_back, rot_back_more);
		ok(isIdentity(I), 'Expected identity matrix when rotating there and back');

		// scale up and down
		var scale_up = svg.createSVGMatrix().scale(4),
			scale_down = svg.createSVGMatrix().scaleNonUniform(0.25,1);
			scale_down_more = svg.createSVGMatrix().scaleNonUniform(1,0.25);
		I = mult(scale_up, scale_down, scale_down_more);
		ok(isIdentity(I), 'Expected identity matrix when scaling up and down');

		// test multiplication with its inverse 
		I = mult(rot_there, rot_there.inverse());
		ok(isIdentity(I), 'Expected identity matrix when multiplying a matrix by its inverse');
		I = mult(rot_there.inverse(), rot_there);
		ok(isIdentity(I), 'Expected identity matrix when multiplying a matrix by its inverse');
	});
  }); 
  </script>  
</head>  
<body>  
  <h1 id='qunit-header'>Unit Tests for math.js</h1>
  <h2 id='qunit-banner'></h2>
  <h2 id='qunit-userAgent'></h2>
  <ol id='qunit-tests'>
  </ol>
</body>  
</html>
